package com.woniuxy.common.filter;

import org.springframework.http.HttpStatus;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 解决跨域问题的过滤器
 *跨域问题典型出现为，ajax发送请求没有Access-Control-Allow-Origin报错（访问可以响应不回来），以及设置请求头暴露等
 */
@WebFilter("/*")
public class OaCorsFilter implements Filter {
    private final int time = 20*24*60*60;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        HttpServletRequest request =(HttpServletRequest)  servletRequest;
        // 允许任意站访问
        resp.setHeader("Access-Control-Allow-Origin", "*");
        // 这个allow-headers要配为*，这样才能允许所有的请求头 --- update by zxy  in 2018-10-19
        resp.setHeader("Access-Control-Allow-Headers", "*");
        //允许任何方法（post、get等）
        resp.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
        //maxAge(3600)表明在3600秒内，不需要再发送预检验请求
        resp.setHeader("Access-Control-Max-Age", time+"");
        //设置允许脚本获取所有的头信息，否则设置在响应头中的数据js获取不到
        resp.setHeader("Access-Control-Expose-Headers","*");
        //若为OPTIONS请求直接返回正常即可浏览器基于CORS（跨域资源共享）机制，对于跨域 & 复杂的XMLHttpRequest和Fetch API请求，首先使用 options 方法向服务器发起一个预检请求（preflight request），服务器确认允许之后，再发起实际的 HTTP 请求
        if("OPTIONS".equals(request.getMethod())){
            //返回正常也即200，不直接用200是为了养成避免出现魔鬼数字
            resp.setStatus(HttpStatus.OK.value());
            return;
        }
        filterChain.doFilter(request, resp);
    }
}
